package com.stx.test.object;

import java.util.Objects;

/**
 * packageName com.stx.test.object
 *
 * @author YangYi
 * @className Student
 * @date 2025/9/17
 * @description TODO
 */
public class Student implements Cloneable{
    private int id; // 学号 - 作为判断相等的关键字段
    private String name;
    private int age;

    @Override
    public boolean equals(Object obj) {
        // 比较对象地址是否相同
//        return super.equals(obj);
//        return (this == obj);
        // 1. 检查是否指向同一个对象（地址相同）
        if (this == obj) {
            return true;
        }
        // 2. 检查传入对象是否为null，以及是否是同一个类
        //    使用 getClass() 保证对称性，防止子类对象等于父类对象
        if (obj == null || this.getClass() != obj.getClass()) {
            return false;
        }
        // 3. 将 obj 强制转换为当前类型 (Student)
        Student other = (Student) obj;

        // 4. 开始比较所有关键字段（决定相等性的字段）
        //    对于基本类型，直接用 == 比较
        //    对于引用类型，用 Objects.equals() 比较（可安全处理null）
        return this.id == other.id; // 核心：仅凭id判断是否相等
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
